home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / gfx / misc / gnuplot-3.7src.lha / gnuplot-3.7src / gnuplot-3.7.lha / gnuplot-3.7 / term / metafont.trm < prev    next >
Text File  |  1998-12-15  |  20KB  |  623 lines

  1. /*
  2.  * $Id: metafont.trm,v 1.14 1998/04/14 00:17:54 drd Exp $
  3.  */
  4.  
  5. /* GNUPLOT - metafont.trm */
  6.  
  7. /*[
  8.  * Copyright 1986 - 1993, 1998   Thomas Williams, Colin Kelley
  9.  *
  10.  * Permission to use, copy, and distribute this software and its
  11.  * documentation for any purpose with or without fee is hereby granted,
  12.  * provided that the above copyright notice appear in all copies and
  13.  * that both that copyright notice and this permission notice appear
  14.  * in supporting documentation.
  15.  *
  16.  * Permission to modify the software is granted, but not the right to
  17.  * distribute the complete modified source code.  Modifications are to
  18.  * be distributed as patches to the released version.  Permission to
  19.  * distribute binaries produced by compiling modified sources is granted,
  20.  * provided you
  21.  *   1. distribute the corresponding source modifications from the
  22.  *    released version in the form of a patch file along with the binaries,
  23.  *   2. add special version identification to distinguish your version
  24.  *    in addition to the base release version number,
  25.  *   3. provide your name and address as the primary contact for the
  26.  *    support of your modified version, and
  27.  *   4. retain our contact information in regard to use of the base
  28.  *    software.
  29.  * Permission to distribute the released version of the source code along
  30.  * with corresponding source modifications in the form of a patch file is
  31.  * granted with same provisions 2 through 4 for binary distributions.
  32.  *
  33.  * This software is provided "as is" without express or implied warranty
  34.  * to the extent permitted by applicable law.
  35. ]*/
  36.  
  37. /*
  38.  *              GNUPLOT -- mf.trm
  39.  *
  40.  *            This terminal driver supports:
  41.  *               Metafont Plot Commands
  42.  *
  43.  * Written by : Pl Hedne
  44.  *        Trondheim, Norway
  45.  *        Pal.Hedne@termo.unit.no
  46.  */
  47.  
  48. /*
  49.  * Improvements and bug fixes by Carsten Steger:
  50.  * - Set default plot size to 5 by 3 inches as in the latex- and eepic-
  51.  *   drivers
  52.  * - Fixed some bugs concerning resolution dependent output
  53.  * - Added MF_scale function
  54.  * - Added MF_justify_text function and modified MF_put_text function and
  55.  *   put_text macro accordingly
  56.  * - Modified MF_move and MF_vector to make output shorter and modified
  57.  *   MF_text accordingly
  58.  * - Added various linetypes by plotting dashed lines; had to modify
  59.  *   MF_linetype and MF_vector for this
  60.  * - Added MF_arrow function
  61.  * - All global variables and #define'd names begin with MF_ now
  62.  * As a consequence almost nothing of the original code by Pl Hedne remains
  63.  * but credit goes to him for the ingenious trick of storing the character
  64.  * images into picture variables, without which this driver would have been
  65.  * impossible for me to write.
  66.  *
  67.  * 10/03/95: Converted to new terminal layout by Carsten Steger.
  68.  */
  69.  
  70. #include "driver.h"
  71.  
  72. #ifdef TERM_REGISTER
  73. register_term(mf)
  74. #endif
  75.  
  76. #ifdef TERM_PROTO
  77.  
  78. #define MF_DPI (300)
  79. /* resolution of printer we expect to use; the value itself is not
  80.  * particularly important... it is here only for compatibility to the
  81.  * LaTeX-driver and to get the spacing right. */
  82.  
  83. /* 5 inches wide by 3 inches high (default) */
  84. #define MF_XSIZE 5.0
  85. #define MF_YSIZE 3.0
  86. #define MF_XMAX (MF_XSIZE*MF_DPI)
  87. #define MF_YMAX (MF_YSIZE*MF_DPI)
  88.  
  89. #define MF_HTIC (5*MF_DPI/72)
  90. #define MF_VTIC (5*MF_DPI/72)
  91. #define MF_HCHAR (MF_DPI*53/10/72)
  92. #define MF_VCHAR (MF_DPI*11/72)
  93.  
  94. TERM_PUBLIC void MF_init __PROTO((void));
  95. TERM_PUBLIC void MF_graphics __PROTO((void));
  96. TERM_PUBLIC void MF_text __PROTO((void));
  97. TERM_PUBLIC int MF_justify_text __PROTO((enum JUSTIFY mode));
  98. TERM_PUBLIC int MF_text_angle __PROTO((int ang));
  99. TERM_PUBLIC void MF_linetype __PROTO((int linetype));
  100. TERM_PUBLIC void MF_move __PROTO((unsigned int x, unsigned int y));
  101. TERM_PUBLIC void MF_vector __PROTO((unsigned int x, unsigned int y));
  102. TERM_PUBLIC void MF_arrow __PROTO((unsigned int sx, unsigned int sy,
  103.                    unsigned int ex, unsigned int ey,
  104.                    TBOOLEAN head));
  105. TERM_PUBLIC void MF_put_text __PROTO((unsigned int x, unsigned int y, char *str));
  106. TERM_PUBLIC void MF_reset __PROTO((void));
  107.  
  108. #define GOT_MF_PROTO
  109.  
  110. #endif /* TERM_PROTO */
  111.  
  112.  
  113. #ifndef TERM_PROTO_ONLY
  114.  
  115. #ifdef TERM_BODY
  116.  
  117.  
  118. /* Plot size in inches */
  119. static double MF_xsize = MF_XSIZE;
  120. static double MF_ysize = MF_YSIZE;
  121. static int MF_char_code;
  122. static int MF_ang;
  123. static int MF_line_type;
  124. static enum JUSTIFY MF_justify;
  125. static double MF_dist_left;
  126. static int MF_is_solid;
  127. static int MF_picked_up_pen;
  128. /* 
  129.  * We keep track of where we are with respect to dashed lines by using
  130.  * the next five variables. MF_dash_index indicates which element of
  131.  * MF_lines[..].dashlen should be used. The MF_last.. variables keep
  132.  * track of the position of the pen.
  133.  */
  134. static int MF_dash_index;
  135. static unsigned int MF_last_x, MF_last_y;
  136.  
  137. static struct {
  138.     int solid;            /* Is the line solid? */
  139.     float thickness;        /* Thickness of pen we are going to use */
  140.     int dashlen[4];        /* Length of individual segments; even: line; odd: gap */
  141. } MF_lines[10] =
  142. {
  143.     {
  144.     1, 1.5, { 0, 0, 0, 0 }
  145.     },
  146.     {
  147.     0, 1.0, { MF_DPI / 60, MF_DPI / 50, MF_DPI / 60, MF_DPI / 50 }
  148.     },
  149.     {
  150.     1, 1.5, { 0, 0, 0, 0 }
  151.     },
  152.     {
  153.     0, 1.5, { MF_DPI / 20, MF_DPI / 30, MF_DPI / 20, MF_DPI / 30 }
  154.     },
  155.     {
  156.     0, 1.5, { MF_DPI / 30, MF_DPI / 20, MF_DPI / 30, MF_DPI / 20 }
  157.     },
  158.     {
  159.     0, 1.5, { MF_DPI / 15, MF_DPI / 30, MF_DPI / 60, MF_DPI / 30 }
  160.     },
  161.     {
  162.     0, 1.5, { MF_DPI / 30, MF_DPI / 50, MF_DPI / 30, MF_DPI / 50 }
  163.     },
  164.     {
  165.     0, 1.5, { MF_DPI / 20, MF_DPI / 50, MF_DPI / 60, MF_DPI / 30 }
  166.     },
  167.     {
  168.     0, 1.5, { MF_DPI / 30, MF_DPI / 50, MF_DPI / 30, MF_DPI / 30 }
  169.     },
  170.     {
  171.     0, 1.5, { MF_DPI / 60, MF_DPI / 50, MF_DPI / 60, MF_DPI / 30 }
  172.     }
  173.     /* dash: line,     gap,      line,     gap      */
  174. };
  175.  
  176.  
  177.  
  178. TERM_PUBLIC void MF_init()
  179. {
  180.     MF_char_code = 0;
  181.     MF_ang = 0;
  182.  
  183.     fputs("\
  184. if unknown cmbase: input cmbase fi\n\n\
  185. tracingstats:=1;\n\
  186. picture r[];\n\
  187. \ndef openit = openwindow currentwindow\n\
  188.   from (0,0) to (400,800) at (-50,500) enddef;\n\
  189. \nmode_setup;\n", gpoutfile);
  190.  
  191.     fputs("\
  192. \n%Include next eight lines if you have problems with the mode on your system..\n\
  193. %proofing:=0;\n\
  194. %fontmaking:=1;\n\
  195. %tracingtitles:=0;\n\
  196. %pixels_per_inch:=300;\n\
  197. %blacker:=0;\n\
  198. %fillin:=.2;\n\
  199. %o_correction:=.6;\n\
  200. %fix_units;\n", gpoutfile);
  201.  
  202.     /* Next lines must be included if text support is needed (CM base used) */
  203.     fputs("\
  204. \ndef put_text(expr ts,xstart,ystart,rot,justification) =\n\
  205.   begingroup\n\
  206.     text_width:=0;text_height:=0;\n\
  207.     for ind:=0 step 1 until length(ts)-1:\n\
  208.       dec_num:=ASCII substring (ind,ind+1) of ts;\n\
  209.       if unknown r[dec_num]: dec_num:=32; fi\n\
  210.       if dec_num=32: \n\
  211.         text_width:=text_width+wd[65];\n\
  212.         text_height:=GPMAX(text_height,ht[65]+dp[65]);\n\
  213.       elseif dec_num>=0: \n\
  214.         text_width:=text_width+wd[dec_num];\n\
  215.         text_height:=GPMAX(text_height,ht[dec_num]+dp[dec_num]);\n\
  216.       fi\n\
  217.     endfor\n\
  218.     if rot=90:\n\
  219.       if justification=1: ynext:=ystart;\n\
  220.       elseif justification=2: ynext:=round(ystart-text_width/2);\n\
  221.       else: ynext:=round(ystart-text_width);\n\
  222.       fi\n\
  223.       xnext:=xstart+text_height/2;\n\
  224.     else:\n\
  225.       if justification=1: xnext:=xstart;\n\
  226.       elseif justification=2: xnext:=round(xstart-text_width/2);\n\
  227.       else: xnext:=round(xstart-text_width);\n\
  228.       fi\n\
  229.       ynext:=ystart-text_height/2;\n\
  230.     fi\n\
  231.     for ind:=0 step 1 until length(ts)-1:\n\
  232.       dec_num:=ASCII substring (ind,ind+1) of ts;\n\
  233.       if unknown r[dec_num]: dec_num:=32; fi\n\
  234.       if dec_num=32: \n\
  235.         xnext:=xnext+wd[65]*cosd rot;\n\
  236.         ynext:=ynext+wd[65]*sind rot;\n\
  237.       elseif dec_num>=0: \n\
  238.         currentpicture:=currentpicture+r[dec_num] shifted(xnext,ynext)\n\
  239.           rotatedaround ((xnext,ynext),rot); \n\
  240.         xnext:=xnext+wd[dec_num]*cosd rot;\n\
  241.         ynext:=ynext+wd[dec_num]*sind rot;\n\
  242.       fi\n\
  243.     endfor\n\
  244.   endgroup \n\
  245. enddef;\n", gpoutfile);
  246.  
  247.     fputs("\
  248. \ndef endchar =\n\
  249.   r[charcode]:=currentpicture;\n\
  250.   wd[charcode]:=w;ht[charcode]:=h;dp[charcode]:=d;\n\
  251.   message \"Picture of charcode no.\" & decimal charcode;\n\
  252.   endgroup;\n\
  253. enddef;\n\
  254. let endchar_ = endchar;\n\
  255. let generate = relax;\n\
  256. let roman = relax;\n", gpoutfile);
  257.  
  258.     fputs("\
  259. input cmr10.mf\n\
  260. if ligs>1: font_coding_scheme:=\"TeX text\";\n\
  261.   spanish_shriek=oct\"074\"; spanish_query=oct\"076\";\n\
  262. else: font_coding_scheme:=\n\
  263.   if ligs=0: \"TeX typewriter text\"\n\
  264.   else: \"TeX text without f-ligatures\" fi;\n\
  265.   spanish_shriek=oct\"016\"; spanish_query=oct\"017\"; fi\n\
  266. font_setup;\n\
  267. input romanu.mf %Roman uppercase.\n\
  268. input romanl.mf %Roman lowerrcase.\n\
  269. input greeku.mf %Greek uppercase.\n\
  270. input romand.mf %Numerals.\n\
  271. input romanp.mf %Ampersand, question marks, currency sign.\n\
  272. input romspl.mf %Lowercase specials (dotless \\i, ligature \\ae, etc.)\n\
  273. input romspu.mf %Uppercase specials (\\AE, \\OE, \\O)\n\
  274. input punct.mf %Punctuation symbols.\n\
  275. \nminus=ASCII\"-\"; cmchar \"Minus sign\";\n\
  276. beginarithchar(minus); \n\
  277.   pickup rule.nib;\n\
  278.   lft x1=hround 1.5u-eps;\n\
  279.   x2=w-x1; y1=y2=math_axis;\n\
  280.   draw z1--z2;     % bar\n\
  281.   labels(1,2); \n\
  282. endchar;\n", gpoutfile);
  283.  
  284.     fputs("\
  285. \ncmchar \"Period\";\n\
  286.   numeric dot_diam#; dot_diam#:=if monospace: 5/4 fi\\ dot_size#;\n\
  287.   define_whole_blacker_pixels(dot_diam);\n\
  288.   beginchar(\".\",5u#,dot_diam#,0);\n\
  289.   adjust_fit(0,0); pickup fine.nib;\n\
  290.   pos1(dot_diam,0); pos2(dot_diam,90);\n\
  291.   lft x1l=hround(.5w-.5dot_diam); bot y2l=0; z1=z2; dot(1,2);    % dot\n\
  292.   penlabels(1,2);\n\
  293. endchar;\n", gpoutfile);
  294.  
  295.     fputs("\
  296. \ndef endchar =\n\
  297.   % Next line should probably be removed if CM base is used\n\
  298.   l:=0; r:=w;\n\
  299.   %Include the next two lines if you want to\n\
  300.   %rotate the picture 90 deg.(Portrait to Landscape)\n\
  301.   %currentpicture:=currentpicture rotated 90 shifted (h,0);\n\
  302.   %tmp:=charht; charht:=charwd; charwd:=tmp;\n\
  303.   scantokens extra_endchar;\n\
  304.   if proofing>0: makebox(proofrule); fi\n\
  305.   chardx:=w;\n\
  306.   shipit;\n\
  307.   if displaying>0: makebox(screenrule); showit; fi\n\
  308.   endgroup \n\
  309. enddef;\n\
  310. let endchar_ = endchar;\n\
  311. let generate = input;\n\
  312. let roman = roman;\n", gpoutfile);
  313.  
  314.     /* font_size must be bigger than em#/16 by METAFONT rules.
  315.      * Therefore make it pretty big so big figures will be
  316.      * handled correctly. Setting font_size to 72pt# lets us
  317.      * handle characters up to 15.94 by 15.94 inches. */
  318.     fputs("\
  319. \n\nfont_identifier:=\"GNUPLOT\";\n\
  320. font_size 72pt#;\n\
  321. th#=0.4pt#; define_whole_pixels(th);\n\
  322. \npath arrowhead;\n\
  323. arrowhead = (-7pt,-2pt){dir30}..(-6pt,0pt)..\
  324. {dir150}(-7pt,2pt) &\n\
  325.   (-7pt,2pt)--(0pt,0pt)--(-7pt,-2pt) & cycle;\n", gpoutfile);
  326. }
  327.  
  328.  
  329. TERM_PUBLIC void MF_graphics()
  330. {
  331.     register struct termentry *t = term;
  332.  
  333.     fprintf(gpoutfile, "\n\nbeginchar(%d,%gin#,%gin#,0);\n",
  334.         MF_char_code, MF_xsize, MF_ysize);
  335.     MF_char_code++;
  336.     fprintf(gpoutfile, "a:=w/%d;b:=h/%d;\n", t->xmax, t->ymax);
  337.     MF_picked_up_pen = 0;
  338. }
  339.  
  340.  
  341. TERM_PUBLIC void MF_text()
  342. {
  343.     fputs("endchar;\n", gpoutfile);
  344. }
  345.  
  346.  
  347. TERM_PUBLIC int MF_justify_text(mode)
  348. enum JUSTIFY mode;
  349. {
  350.     MF_justify = mode;
  351.     return TRUE;
  352. }
  353.  
  354.  
  355. TERM_PUBLIC int MF_text_angle(ang)
  356. int ang;
  357. {
  358.     if (ang > 0)
  359.     MF_ang = 90;
  360.     else
  361.     MF_ang = 0;
  362.     return TRUE;
  363. }
  364.  
  365.  
  366. TERM_PUBLIC void MF_linetype(linetype)
  367. int linetype;
  368. {
  369.     if (linetype >= 8)
  370.     linetype %= 8;
  371.     linetype += 2;
  372.     /* Only output change in pens if it actually affects the pen used */
  373.     if ((MF_lines[linetype].thickness != MF_lines[MF_line_type].thickness) ||
  374.     (!MF_picked_up_pen)) {
  375.     fprintf(gpoutfile, "pickup pencircle scaled %gth;\n",
  376.         MF_lines[linetype].thickness);
  377.     MF_picked_up_pen = 1;
  378.     }
  379.     MF_line_type = linetype;
  380.     MF_dash_index = 0;
  381.     MF_dist_left = MF_lines[MF_line_type].dashlen[MF_dash_index];
  382.     MF_is_solid = MF_lines[MF_line_type].solid;
  383. }
  384.  
  385.  
  386. TERM_PUBLIC void MF_move(x, y)
  387. unsigned int x, y;
  388. {
  389.     MF_last_x = x;
  390.     MF_last_y = y;
  391.     MF_dash_index = 0;
  392.     MF_dist_left = MF_lines[MF_line_type].dashlen[MF_dash_index];
  393. }
  394.  
  395.  
  396. TERM_PUBLIC void MF_vector(x, y)
  397. unsigned int x, y;
  398. {
  399.     if (MF_is_solid) {
  400.     if (x == MF_last_x && y == MF_last_y)
  401.         fprintf(gpoutfile, "drawdot (%da,%db);\n", x, y);
  402.     else
  403.         fprintf(gpoutfile, "draw (%da,%db)--(%da,%db);\n",
  404.             MF_last_x, MF_last_y, x, y);
  405.     } else {
  406.     double dist_to_go, delta_x, delta_y, inc_x, inc_y;
  407.     double last_x_d, last_y_d, next_x_d, next_y_d;
  408.     unsigned int next_x, next_y;
  409.  
  410.     if (x == MF_last_x && y == MF_last_y) {
  411.         if (!(MF_dash_index & 1))
  412.         fprintf(gpoutfile, "drawdot (%da,%db);\n", x, y);
  413.     } else {
  414.         last_x_d = MF_last_x;
  415.         last_y_d = MF_last_y;
  416.         delta_x = x - last_x_d;
  417.         delta_y = y - last_y_d;
  418.         dist_to_go = sqrt(delta_x * delta_x + delta_y * delta_y);
  419.         inc_x = delta_x / dist_to_go;
  420.         inc_y = delta_y / dist_to_go;
  421.         while (MF_dist_left < dist_to_go) {
  422.         next_x_d = last_x_d + inc_x * MF_dist_left;
  423.         next_y_d = last_y_d + inc_y * MF_dist_left;
  424.         next_x = floor(next_x_d + 0.5);
  425.         next_y = floor(next_y_d + 0.5);
  426.         /* MF_dash_index & 1 == 0 means: draw a line; otherwise just move */
  427.         if (!(MF_dash_index & 1))
  428.             fprintf(gpoutfile, "draw (%da,%db)--(%da,%db);\n",
  429.                 MF_last_x, MF_last_y, next_x, next_y);
  430.         MF_last_x = next_x;
  431.         MF_last_y = next_y;
  432.         last_x_d = next_x_d;
  433.         last_y_d = next_y_d;
  434.         dist_to_go -= MF_dist_left;
  435.         MF_dash_index = (MF_dash_index + 1) & 3;
  436.         MF_dist_left = MF_lines[MF_line_type].dashlen[MF_dash_index];
  437.         }
  438.         delta_x = x - last_x_d;
  439.         delta_y = y - last_y_d;
  440.         MF_dist_left -= sqrt(delta_x * delta_x + delta_y * delta_y);
  441.         if (!(MF_dash_index & 1)) {
  442.         if (x == MF_last_x && y == MF_last_y)
  443.             fprintf(gpoutfile, "drawdot (%da,%db);\n", x, y);
  444.         else
  445.             fprintf(gpoutfile, "draw (%da,%db)--(%da,%db);\n",
  446.                 MF_last_x, MF_last_y, x, y);
  447.         }
  448.     }
  449.     }
  450.     MF_last_x = x;
  451.     MF_last_y = y;
  452. }
  453.  
  454.  
  455. TERM_PUBLIC void MF_arrow(sx, sy, ex, ey, head)
  456. unsigned int sx, sy, ex, ey;
  457. TBOOLEAN head;
  458. {
  459.     int delta_x, delta_y;
  460.  
  461.     MF_move(sx, sy);
  462.     MF_vector(ex, ey);
  463.     if (head) {
  464.     delta_x = ex - sx;
  465.     delta_y = ey - sy;
  466.     fprintf(gpoutfile, "fill arrowhead rotated angle(%d,%d) shifted (%da,%db);\n",
  467.         delta_x, delta_y, ex, ey);
  468.     }
  469. }
  470.  
  471.  
  472. TERM_PUBLIC void MF_put_text(x, y, str)
  473. unsigned int x, y;
  474. char *str;
  475. {
  476.     int i, j = 0;
  477.  
  478.     for (i = 0; i < strlen(str); i++)
  479.     if (str[i] == '"')
  480.         str[i] = '\'';    /* Replace " with ' */
  481.     switch (MF_justify) {
  482.     case LEFT:
  483.     j = 1;
  484.     break;
  485.     case CENTRE:
  486.     j = 2;
  487.     break;
  488.     case RIGHT:
  489.     j = 3;
  490.     break;
  491.     }
  492.     fprintf(gpoutfile, "put_text(\"%s\",%da,%db,%d,%d);\n",
  493.         str, x, y, MF_ang, j);
  494. }
  495.  
  496.  
  497. TERM_PUBLIC void MF_reset()
  498. {
  499.     fputs("end.\n", gpoutfile);
  500. }
  501.  
  502.  
  503. #endif /* TERM_BODY */
  504.  
  505. #ifdef TERM_TABLE
  506.  
  507. TERM_TABLE_START(mf_driver)
  508.     "mf", "Metafont plotting standard",
  509.     MF_XMAX, MF_YMAX, MF_VCHAR, MF_HCHAR,
  510.     MF_VTIC, MF_HTIC, options_null, MF_init, MF_reset,
  511.     MF_text, null_scale, MF_graphics, MF_move, MF_vector,
  512.     MF_linetype, MF_put_text, MF_text_angle,
  513.     MF_justify_text, line_and_point, MF_arrow, set_font_null
  514. TERM_TABLE_END(mf_driver)
  515.  
  516. #undef LAST_TERM
  517. #define LAST_TERM mf_driver
  518.  
  519. #endif /* TERM_TABLE */
  520. #endif /* TERM_PROTO_ONLY */
  521.  
  522.  
  523. #ifdef TERM_HELP
  524. START_HELP(mf)
  525. "1 mf",
  526. "?commands set terminal mf",
  527. "?set terminal mf",
  528. "?set term mf",
  529. "?terminal mf",
  530. "?term mf",
  531. "?mf",
  532. "?metafont",
  533. " The `mf` terminal driver creates a input file to the METAFONT program.  Thus a",
  534. " figure may be used in the TeX document in the same way as is a character.",
  535. "",
  536. " To use a picture in a document, the METAFONT program must be run with the",
  537. " output file from `gnuplot` as input.  Thus, the user needs a basic knowledge",
  538. " of the font creating process and the procedure for including a new font in a",
  539. " document.  However, if the METAFONT program is set up properly at the local",
  540. " site, an unexperienced user could perform the operation without much trouble.",
  541. "",
  542. " The text support is based on a METAFONT character set.  Currently the",
  543. " Computer Modern Roman font set is input, but the user is in principal free to",
  544. " chose whatever fonts he or she needs.  The METAFONT source files for the",
  545. " chosen font must be available.  Each character is stored in a separate",
  546. " picture variable in METAFONT.  These variables may be manipulated (rotated,",
  547. " scaled etc.) when characters are needed.  The drawback is the interpretation",
  548. " time in the METAFONT program.  On some machines (i.e. PC) the limited amount",
  549. " of memory available may also cause problems if too many pictures are stored.",
  550. "",
  551. " The `mf` terminal has no options.",
  552. "2 METAFONT Instructions",
  553. "?commands set terminal mf detailed",
  554. "?set terminal mf detailed",
  555. "?set term mf detailed",
  556. "?mf detailed",
  557. "?metafont detailed",
  558. "",
  559. " - Set your terminal to METAFONT:",
  560. "   set terminal mf",
  561. " - Select an output-file, e.g.:",
  562. "   set output \"myfigures.mf\"",
  563. " - Create your pictures. Each picture will generate a separate character. Its",
  564. " default size will be 5*3 inches. You can change the size by saying `set size",
  565. " 0.5,0.5` or whatever fraction of the default size you want to have.",
  566. "",
  567. " - Quit `gnuplot`.",
  568. "",
  569. " - Generate a TFM and GF file by running METAFONT on the output of `gnuplot`.",
  570. " Since the picture is quite large (5*3 in), you will have to use a version of",
  571. " METAFONT that has a value of at least 150000 for memmax.  On Unix systems",
  572. " these are conventionally installed under the name bigmf.  For the following",
  573. " assume that the command virmf stands for a big version of METAFONT.  For",
  574. " example:",
  575. "",
  576. " - Invoke METAFONT:",
  577. "     virmf '&plain'",
  578. " - Select the output device: At the METAFONT prompt ('*') type:",
  579. "     \\mode:=CanonCX;     % or whatever printer you use",
  580. " - Optionally select a magnification:",
  581. "     mag:=1;             % or whatever you wish",
  582. " - Input the `gnuplot`-file:",
  583. "     input myfigures.mf",
  584. " On a typical Unix machine there will usually be a script called \"mf\" that",
  585. " executes virmf '&plain', so you probably can substitute mf for virmf &plain.",
  586. " This will generate two files: mfput.tfm and mfput.$$$gf (where $$$ indicates",
  587. " the resolution of your device).  The above can be conveniently achieved by",
  588. " typing everything on the command line, e.g.:",
  589. " virmf '&plain' '\\mode:=CanonCX; mag:=1; input myfigures.mf'",
  590. " In this case the output files will be named myfigures.tfm and",
  591. " myfigures.300gf.",
  592. "",
  593. " - Generate a PK file from the GF file using gftopk:",
  594. "   gftopk myfigures.300gf myfigures.300pk",
  595. " The name of the output file for gftopk depends on the DVI driver you use.",
  596. " Ask your local TeX administrator about the naming conventions.  Next, either",
  597. " install the TFM and PK files in the appropriate directories, or set your",
  598. " environment variables properly.  Usually this involves setting TEXFONTS to",
  599. " include the current directory and doing the same thing for the environment",
  600. " variable that your DVI driver uses (no standard name here...).  This step is",
  601. " necessary so that TeX will find the font metric file and your DVI driver will",
  602. " find the PK file.",
  603. "",
  604. " - To include your pictures in your document you have to tell TeX the font:",
  605. "   \\font\\gnufigs=myfigures",
  606. " Each picture you made is stored in a single character.  The first picture is",
  607. " character 0, the second is character 1, and so on...  After doing the above",
  608. " step, you can use the pictures just like any other characters.  Therefore, to",
  609. " place pictures 1 and 2 centered in your document, all you have to do is:",
  610. "   \\centerline{\\gnufigs\\char0}",
  611. "   \\centerline{\\gnufigs\\char1}",
  612. " in plain TeX.  For LaTeX you can, of course, use the picture environment and",
  613. " place the picture wherever you wish by using the \\makebox and \\put macros.",
  614. "",
  615. " This conversion saves you a lot of time once you have generated the font;",
  616. " TeX handles the pictures as characters and uses minimal time to place them,",
  617. " and the documents you make change more often than the pictures do.  It also",
  618. " saves a lot of TeX memory.  One last advantage of using the METAFONT driver",
  619. " is that the DVI file really remains device independent, because no \\special",
  620. " commands are used as in the eepic and tpic drivers."
  621. END_HELP(mf)
  622. #endif /* TERM_HELP */
  623.